home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / msh-156.lha / han / support.c < prev    next >
C/C++ Source or Header  |  1996-12-22  |  9KB  |  342 lines

  1. /*-
  2.  * $Id: support.c,v 1.56 1996/12/22 00:22:33 Rhialto Rel $
  3.  * $Log: support.c,v $
  4.  * Revision 1.56  1996/12/22  00:22:33  Rhialto
  5.  * Added taskwait() and some packets to debug function.
  6.  *
  7.  * Revision 1.55  1993/12/30  23:02:45    Rhialto
  8.  * Add a few packet names.
  9.  *
  10.  * Revision 1.54  1993/06/24  05:12:49    Rhialto
  11.  * DICE 2.07.54R.
  12.  *
  13.  * Revision 1.53  92/10/25  02:24:40  Rhialto
  14.  * Add 2.0 stuff for debugging. Rearrange some #includes for precompilation.
  15.  *
  16.  * Revision 1.51  92/04/17  15:36:18  Rhialto
  17.  * Freeze for MAXON.
  18.  *
  19.  * Revision 1.46  91/10/06  18:25:58  Rhialto
  20.  *
  21.  * Freeze for MAXON
  22.  *
  23.  * Revision 1.43  91/09/28  01:43:35  Rhialto
  24.  * *** empty log message ***
  25.  *
  26.  * Revision 1.42  91/06/13  23:55:51  Rhialto
  27.  * DICE conversion
  28.  *
  29.  * Revision 1.40  91/03/03  17:46:02  Rhialto
  30.  * Freeze for MAXON
  31.  *
  32.  * Revision 1.30  90/06/04  23:16:41  Rhialto
  33.  * Release 1 Patch 3
  34.  *
  35. -*/
  36.  
  37. #include "han.h"
  38. #include "dos.h"
  39. #include <stdlib.h>
  40.  
  41. #if HDEBUG
  42. #   include "syslog.h"
  43. #else
  44. #   define    debug(x)
  45. #endif
  46.  
  47. Prototype void returnpacket(struct DosPacket *packet);
  48. Prototype struct DosPacket *taskwait(struct Process *myproc);
  49. Prototype long packetsqueued(void);
  50. Prototype void *dosalloc(ulong bytes);
  51. Prototype void dosfree(ulong *ptr);
  52. Prototype void btos(byte *bstr, byte *buf);
  53. Prototype void *GetHead(struct MinList *list);
  54. Prototype void *GetTail(struct MinList *list);
  55. Prototype char *typetostr(long ty);
  56.  
  57. /*
  58.  * PACKET ROUTINES.    Dos Packets are in a rather strange format as you
  59.  * can see by this and how the PACKET structure is extracted in the
  60.  * GetMsg() of the main routine.
  61.  */
  62.  
  63. void
  64. returnpacket(packet)
  65. struct DosPacket *packet;
  66. {
  67.     struct Message *mess;
  68.     struct MsgPort *replyport;
  69.  
  70.     replyport = packet->dp_Port;
  71.     mess = packet->dp_Link;
  72.     packet->dp_Port = DosPort;
  73.     mess->mn_Node.ln_Name = (char *) packet;
  74.     mess->mn_Node.ln_Succ = NULL;
  75.     mess->mn_Node.ln_Pred = NULL;
  76.     PutMsg(replyport, mess);
  77. }
  78.  
  79. #if TASKWAIT
  80.  
  81. /*
  82.  * taskwait() ... Waits for a message to arrive at your port and
  83.  *   extracts the packet address which is returned to you.
  84.  */
  85.  
  86. typedef struct Message *(*funcptr)(__A0 void *);
  87.  
  88. struct DosPacket *
  89. taskwait(myproc)
  90. struct Process *myproc;
  91. {
  92.     struct MsgPort *myport;
  93.     struct Message *mymess;
  94.  
  95.     if (myproc->pr_PktWait) {
  96.     debug(("taskwait external...\n"));
  97.     /* As per AmigaDOS tech. ref. man (V1.1) page 265: */
  98.     /* ``In the same way as GetMsg, the function should */
  99.     /*   return a message when one is available.'' */
  100.     /* The same sentence is in TADM 3rd ed on page 385. */
  101.     mymess = (*(funcptr)myproc->pr_PktWait)(myproc);
  102.     } else {
  103.     debug(("taskwait...\n"));
  104.     myport = &myproc->pr_MsgPort;
  105.     WaitPort(myport);
  106.     mymess = (struct Message *)GetMsg(myport);
  107.     }
  108.     debug(("taskwait: done\n"));
  109.     return((struct DosPacket *)mymess->mn_Node.ln_Name);
  110. }
  111.  
  112. #endif
  113.  
  114. /*
  115.  * Are there any packets queued to our device?
  116.  */
  117.  
  118. long
  119. packetsqueued()
  120. {
  121.     return ((void *) DosPort->mp_MsgList.lh_Head !=
  122.         (void *) &DosPort->mp_MsgList.lh_Tail);    /* & inserted by OIS */
  123. }
  124.  
  125. /*
  126.  * DOS MEMORY ROUTINES
  127.  */
  128.  
  129. void           *
  130. dosalloc(bytes)
  131. ulong    bytes;
  132. {
  133.     ulong *ptr;
  134.  
  135.     bytes += sizeof (*ptr);
  136.     if (ptr = AllocMem(bytes, MEMF_PUBLIC | MEMF_CLEAR)) {
  137.     *ptr = bytes;
  138.     return (ptr + 1);
  139.     }
  140.  
  141.     return NULL;
  142. }
  143.  
  144. void
  145. dosfree(ptr)
  146. ulong *ptr;
  147. {
  148.     --ptr;
  149.     FreeMem(ptr, *ptr);
  150. }
  151.  
  152. /*
  153.  * Convert a BSTR into a normal string.. copying the string into buf. I
  154.  * use normal strings for internal storage, and convert back and forth
  155.  * when required.
  156.  */
  157.  
  158. void
  159. btos(bstr, buf)
  160. byte           *bstr;
  161. byte           *buf;
  162. {
  163.     bstr = BTOC(bstr);
  164.     if (*bstr)
  165.     CopyMem(bstr + 1, buf, (long)*bstr);
  166.     buf[*bstr] = 0;
  167. }
  168.  
  169. /*
  170.  * Some EXEC list handling routines not found in the EXEC library.
  171.  */
  172.  
  173. #ifdef notdef
  174. Prototype void * NextNode(struct MinNode *node);
  175.  
  176. void           *
  177. NextNode(node)
  178. struct MinNode *node;
  179. {
  180.     node = node->mln_Succ;
  181.     if (node->mln_Succ == NULL)
  182.     return (NULL);
  183.     return (node);
  184. }
  185.  
  186. #endif
  187.  
  188. void           *
  189. GetHead(list)
  190. struct MinList *list;
  191. {
  192.     if ((void *) list->mlh_Head != (void *) &list->mlh_Tail)
  193.     return (list->mlh_Head);
  194.     return (NULL);
  195. }
  196.  
  197. void           *
  198. GetTail(list)
  199. struct MinList *list;
  200. {
  201.     if ((void *) list->mlh_Head != (void *) &list->mlh_Tail)
  202.     return (list->mlh_TailPred);
  203.     return (NULL);
  204. }
  205.  
  206. #if HDEBUG
  207. char           *
  208. typetostr(ty)
  209. long ty;
  210. {
  211.     switch (ty) {
  212.  
  213.     /* 1.3 stuff: */
  214.  
  215.     case ACTION_NIL:            /* 0 */
  216.     return ("ACTION_NIL");
  217.     case ACTION_DIE:            /* 5 */
  218.     return ("ACTION_DIE");
  219.     case ACTION_EVENT:            /* 6 */
  220.     return ("ACTION_EVENT");
  221.     case ACTION_CURRENT_VOLUME:     /* 7 */
  222.     return ("ACTION_CURRENT_VOLUME");
  223.     case ACTION_LOCATE_OBJECT:        /* 8 */
  224.     return ("ACTION_LOCATE_OBJECT");
  225.     case ACTION_RENAME_DISK:        /* 9 */
  226.     return ("ACTION_RENAME DISK");
  227.     case ACTION_FREE_LOCK:        /* 15 */
  228.     return ("ACTION_FREE_LOCK");
  229.     case ACTION_DELETE_OBJECT:        /* 16 */
  230.     return ("ACTION_DELETE_OBJECT");
  231.     case ACTION_RENAME_OBJECT:        /* 17 */
  232.     return ("ACTION_RENAME_OBJECT");
  233.     case ACTION_MORE_CACHE:        /* 18 */
  234.     return ("ACTION_MORE_CACHE");
  235.     case ACTION_COPY_DIR:        /* 19 */
  236.     return ("ACTION_COPY_DIR");
  237.     case ACTION_WAIT_CHAR:        /* 20 */
  238.     return ("ACTION_WAIT_FOR_CHAR");
  239.     case ACTION_SET_PROTECT:        /* 21 */
  240.     return ("ACTION_SET_PROTECT");
  241.     case ACTION_CREATE_DIR:        /* 22 */
  242.     return ("ACTION_CREATEDIR");
  243.     case ACTION_EXAMINE_OBJECT:     /* 23 */
  244.     return ("ACTION_EXAMINE OBJ");
  245.     case ACTION_EXAMINE_NEXT:        /* 24 */
  246.     return ("EXAMINE NEXT");
  247.     case ACTION_DISK_INFO:        /* 25 */
  248.     return ("ACTION_DISK INFO");
  249.     case ACTION_INFO:            /* 26 */
  250.     return ("ACTION_INFO");
  251.     case ACTION_FLUSH:            /* 27 */
  252.     return ("ACTION_FLUSH");
  253.     case ACTION_SET_COMMENT:        /* 28 */
  254.     return ("ACTION_SET_COMMENT");
  255.     case ACTION_PARENT:         /* 29 */
  256.     return ("ACTION_PARENT");
  257.     case ACTION_TIMER:            /* 30 */
  258.     return ("ACTION_TIMER");
  259.     case ACTION_INHIBIT:        /* 31 */
  260.     return ("ACTION_INHIBIT");
  261.     case ACTION_SET_DATE:        /* 34 */
  262.     return ("ACTION_SET_DATE");
  263.     case ACTION_READ:            /* 82 */
  264.     return ("ACTION_READ");
  265.     case ACTION_WRITE:            /* 85 */
  266.     return ("ACTION_WRITE");
  267.     case ACTION_SCREEN_MODE:        /* 994 */
  268.     return ("ACTION_SCREEN_MODE");
  269.     case ACTION_FINDUPDATE:        /* 1004 */
  270.     return ("ACTION_FINDUPDATE");
  271.     case ACTION_FINDINPUT:        /* 1005 */
  272.     return ("ACTION_FINDINPUT");
  273.     case ACTION_FINDOUTPUT:        /* 1006 */
  274.     return ("ACTION_FINDOUTPUT");
  275.     case ACTION_END:            /* 1007 */
  276.     return ("ACTION_END");
  277.     case ACTION_SEEK:            /* 1008 */
  278.     return ("ACTION_SEEK");
  279.  
  280.     /* 2.0 stuff: */
  281.  
  282.     case ACTION_SAME_LOCK:        /* 40 */
  283.     return "ACTION_SAME_LOCK";
  284.     case ACTION_CHANGE_SIGNAL:        /* 995 */
  285.     return "ACTION_CHANGE_SIGNAL";
  286.     case ACTION_FORMAT:         /* 1020 */
  287.     return "ACTION_FORMAT";
  288.     case ACTION_MAKE_LINK:        /* 1021 */
  289.     return "ACTION_MAKE_LINK";
  290.     case ACTION_SET_FILE_SIZE:        /* 1022 */
  291.     return "ACTION_SET_FILE_SIZE";
  292.     case ACTION_WRITE_PROTECT:        /* 1023 */
  293.     return "ACTION_WRITE_PROTECT";
  294.     case ACTION_READ_LINK:        /* 1024 */
  295.     return "ACTION_READ_LINK";
  296.     case ACTION_FH_FROM_LOCK:        /* 1026 */
  297.     return "ACTION_FH_FROM_LOCK";
  298.     case ACTION_IS_FILESYSTEM:        /* 1027 */
  299.     return "ACTION_IS_FILESYSTEM";
  300.     case ACTION_CHANGE_MODE:        /* 1028 */
  301.     return "ACTION_CHANGE_MODE";
  302.     case ACTION_COPY_DIR_FH:        /* 1030 */
  303.     return "ACTION_COPY_DIR_FH";
  304.     case ACTION_PARENT_FH:        /* 1031 */
  305.     return "ACTION_PARENT_FH";
  306.     case ACTION_EXAMINE_ALL:        /* 1033 */
  307.     return "ACTION_EXAMINE_ALL";
  308.     case ACTION_EXAMINE_FH:        /* 1034 */
  309.     return "ACTION_EXAMINE_FH";
  310. #if defined(ACTION_DIRECT_READ)
  311.     case ACTION_DIRECT_READ:        /* 1900 CDTV */
  312.     return "ACTION_DIRECT_READ";
  313. #endif
  314.     case ACTION_LOCK_RECORD:        /* 2008 */
  315.     return "ACTION_LOCK_RECORD";
  316.     case ACTION_FREE_RECORD:        /* 2009 */
  317.     return "ACTION_FREE_RECORD";
  318.     case ACTION_ADD_NOTIFY:        /* 4097 */
  319.     return "ACTION_ADD_NOTIFY";
  320.     case ACTION_REMOVE_NOTIFY:        /* 4098 */
  321.     return "ACTION_REMOVE_NOTIFY";
  322.  
  323.     /* 3.0 stuff: */
  324.  
  325.     case ACTION_EXAMINE_ALL_END:    /* 1035 */
  326.     return "ACTION_EXAMINE_ALL_END";
  327.     case ACTION_SET_OWNER:        /* 1036 */
  328.     return "ACTION_SET_OWNER";
  329.     case ACTION_SERIALIZE_DISK:     /* 4200 */
  330.     return "ACTION_SERIALIZE_DISK";
  331.     case ACTION_GET_DISK_FSSM:        /* 4201 */
  332.     return "ACTION_GET_DISK_FSSM";
  333.     case ACTION_FREE_DISK_FSSM:     /* 4201 */
  334.     return "ACTION_FREE_DISK_FSSM";
  335.  
  336.     default:
  337.     return ("---------UNKNOWN-------");
  338.     }
  339. }
  340.  
  341. #endif                /* HDEBUG */
  342.